from urllib.request import urlopen

from django.shortcuts import render

# Create your views here.
from rest_framework import status
from rest_framework.response import Response
from rest_framework.views import APIView
from mall import settings
from urllib.parse import urlencode, parse_qs
from .utils import OauthQQTool
import json
from .models import OAuthQQuser
from .serializers import QQTokenSerializer

class QQAuthURLView(APIView):
    """
    请求方式： GET /oauth/qq/statues/
    """

    def get(self, request):
        # 生成auth_url
        # https://graph.qq.com/oauth2.0/authorize?xxx=xxx
        # 请求参数请包含如下内容：
        # response_type   必须      授权类型，此值固定为“code”。
        # client_id       必须      申请QQ登录成功后，分配给应用的appid。
        # redirect_uri    必须      成功授权后的回调地址，必须是注册appid时填写的主域名下的地址，建议设置为网站首页或网站的用户中心。注意需要将url进行URLEncode。
        # state           必须      client端的状态值。用于第三方应用防止CSRF攻击，成功授权后回调时会原样带回。请务必严格按照流程检查用户与state参数状态的绑定。
        # scope              可选      scope=get_user_info
        state = request.query_params.get('state')
        qq = OauthQQTool()
        auth_url = qq.get_auth_url()
        return Response({'auth_url': auth_url})


class QQTokenView(APIView):
    def get(self, request):
        # PC网站：https://graph.qq.com/oauth2.0/token
        # GET
        # grant_type      必须      授权类型，在本步骤中，此值为“authorization_code”。
        # client_id       必须      申请QQ登录成功后，分配给网站的appid。
        # client_secret   必须      申请QQ登录成功后，分配给网站的appkey。
        # code            必须      上一步返回的authorization
        # redirect_uri    必须      与上面一步中传入的redirect_uri保持一致。
        code = request.query_params.get('code')
        if code is None:
            return Response(status=status.HTTP_400_BAD_REQUEST)
        qq = OauthQQTool()
        try:
            token = qq.get_access_token_by_code(code)

            openid = qq.get_openid_by_token(token)
        except Exception:
            return Response({'message': '服务异常'}, status=status.HTTP_503_SERVICE_UNAVAILABLE)

        # 1.根据openid来判断用户是否存在
        try:
            qq_user = OAuthQQuser.objects.get(openid=openid)
        except OAuthQQuser.DoesNotExist:
            # 2.没有绑定过需要将openid和user信息绑定
            access_token = OAuthQQuser.generic_token_by_openid(openid)
            return Response({'access_token': access_token})
        else:
            # 3.绑定过，直接返回登录的token
            from rest_framework_jwt.settings import api_settings
            # 补充生成记录登录状态的token
            jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
            jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
            payload = jwt_payload_handler(qq_user.user)
            token = jwt_encode_handler(payload)
            return Response({
                'token': token,
                'user_id': qq_user.user.id,
                'username': qq_user.user.username,
            })

    def post(self,request):
        """   明确你的需求,分析已知条件, 根据已知条件,创建实现的步骤
        1. 前段应该将 短信,密码和手机号 以及 access_token(openid)的信息 传递给我们
        2. 后端接受到数据之后,对数据进行校验
        3.  user信息??? 我们根据手机号来判断
        4. 我们需要将 openid 和 user信息保存(绑定)起来
        """
        serializer = QQTokenSerializer(data=request.data)
        serializer.is_valid()
        user = serializer.save()
        from rest_framework_jwt.settings import api_settings
        # 补充生成记录登录状态的token
        jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
        jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
        payload = jwt_payload_handler(user)
        token = jwt_encode_handler(payload)
        return Response({
            'token': token,
            'user_id': user.id,
            'username': user.username,
        })